This is a brief comparison of definitions for “middle neighborhoods” in Baltimore. The two definitions being compared are:

U.S. Census data being used are the 2012-2016 (5-year) American Community Survey estimates.

Are there any other definitions we should consider?

incomplete final line found on 'https://data.baltimorecity.gov/resource/h3fx-54q3.geojson'

Middle Neighborhoods - HMT Definiton

This map shows only middle neighborhoods based on HMT (includes only typologies D through H). Black borders and labels-on-hover are for neighborhoods. At first glance, this removes neighborhoods within the “white L” and “black butterfly” neighborhoods of Baltimore, with most everything else remaining.

Breaking “middle” into “lower middle” (F, G, H) and “upper middle” (D, E) and including “healthy” and "distressed:

Middle Neighborhoods - Median Income Definition

This map shows only middle neighborhoods based on the median income definition - that is, block groups where the household median income is between 75% and 125% of the area median income (Baltimore-Columbia-Towson for 2016). Qualitatively, this results in a more sparse and disjointed definition of middle neighborhoods.

Comparison of Definitions

The map below overlays the two definitions.

Below is a table comparing the two definitions based on the number of block groups and population in each tier. About 55% of Baltimore residents live in a middle neighborhood based on the HMT definition. However, only about 14% of the city’s population makes between 75% and 125% of AMI. 75% of the city population lives in a block group with median income below 75% of AMI. (Use the right triangle arrow at the right side of the table heading to see additional columns.)

Incomes in HMT Middle Neighborhoods

The table below shows the combination of neighborhood housing market tier (based on HMT) and median income levels in each market tier (below 75% AMI, between 75% and 125% AMI, more than 125% AMI).

AMI used is $86,700 based on HUD’s FY16 figure for Baltimore-Columbia-Towson. For FY18, the number is $94,400, however the median income data being used in this analysis is the 5-year ACS estimates ending in 2016.

Interesting to note that all housing market tiers include the low and middle median income ranges, but only the healthy HMT tier includes block groups with median incomes over 125% of AMI.

Here’s an alarming nugget: 55% of the city population is in a middle neighborhood , and 90% of the middle neighborhood population lives in a block group with a median income less than 75% AMI:

Middle Neighborhoods with Low or High Incomes

(No middle neighborhood block groups with >125% AMI.)

Healthy and Distressed Neighborhoods with Moderate Income

Healthy Neighborhoods with Low Median Income

Characteristics of Middle Neighborhoods

Using the HMT definition for middle neighborhoods, the following are looks at block group characteristics grouped by tier.

Because the HMT uses a cluster analysis that includes several housing variables, we’d expect there to be an overlap in the median income distributions because the tiers were not defined by median income.

Difference in median incomes between upper and lower middle neighborhoods.

Middle neighborhoods do seem to skew towards older homeownership.

Below is the average block group percentage of homeowners that are over the age of 65.

While about 54% of the city population lives in middle neighborhoods, 65% of the households with a homeowner 65 years of age or older live in a middle neighborhood.

LS0tDQp0aXRsZTogIldoYXQgaXMgYSBNaWRkbGUgTmVpZ2hib3Job29kPyINCiNzdWJ0aXRsZTogDQphdXRob3I6ICJKdXN0aW4gRWxzemFzeiINCmRhdGU6ICJGZWJydWFyeSAzLCAyMDE5Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAyDQogICAgdG9jX2Zsb2F0OiBmYWxzZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQoNClRoaXMgaXMgYSBicmllZiBjb21wYXJpc29uIG9mIGRlZmluaXRpb25zIGZvciAibWlkZGxlIG5laWdoYm9yaG9vZHMiIGluIEJhbHRpbW9yZS4gVGhlIHR3byBkZWZpbml0aW9ucyBiZWluZyBjb21wYXJlZCBhcmU6DQoNCi0gVS5TLiBDZW5zdXMgYmxvY2sgZ3JvdXBzIHdpdGggKipob3VzaW5nIG1hcmtldCB0eXBvbG9naWVzIEQgdGhyb3VnaCBIKiogYmFzZWQgb24gdGhlIFsyMDE3IEhvdXNpbmcgTWFya2V0IFR5cG9sb2d5XShodHRwczovL3BsYW5uaW5nLmJhbHRpbW9yZWNpdHkuZ292L21hcHMtZGF0YS9ob3VzaW5nLW1hcmtldC10eXBvbG9neSkgYW5hbHlzaXMgKGhlYWx0aHkgPSBBLCBCLCBDOyBkaXN0cmVzc2VkID0gSSwgSikNCi0gVS5TLiBDZW5zdXMgYmxvY2sgZ3JvdXBzIHdpdGggKiptZWRpYW4gaG91c2Vob2xkIGluY29tZSBiZXR3ZWVuIDc1JSBhbmQgMTI1JSBvZiB0aGUgY2l0eSdzIGFyZWEgbWVkaWFuIGluY29tZSoqDQoNClUuUy4gQ2Vuc3VzIGRhdGEgYmVpbmcgdXNlZCBhcmUgdGhlIDIwMTItMjAxNiAoNS15ZWFyKSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IGVzdGltYXRlcy4NCg0KQXJlIHRoZXJlIGFueSBvdGhlciBkZWZpbml0aW9ucyB3ZSBzaG91bGQgY29uc2lkZXI/DQoNCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTYsDQogICAgICAgICAgICAgICAgICAgICAgZWNobz1GLCB3YXJuaW5nPUYsIG1lc3NhZ2U9RiwgaW5jbHVkZT1UKQ0KYGBgDQoNCmBgYHtyIGluY2x1ZGUgPSBGfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZ2dpdGVhbSkNCmxpYnJhcnkocmVhZHhsKQ0KI2xpYnJhcnkoUk9EQkMpDQpsaWJyYXJ5KG1hcHRvb2xzKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShyZ2RhbCkNCmxpYnJhcnkocmdlb3MpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShodHRyKQ0KbGlicmFyeShqc29ubGl0ZSkNCmxpYnJhcnkoZ2VvanNvbnNmKQ0KbGlicmFyeShyYXN0ZXIpDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GfQ0Kc291cmNlKCIuLi9jb2RlLzAwX2luaXRpYWxpemUuUiIpDQoNCmhtdCA8LSBnZXRfYmxvY2tfZ3JvdXBfZGF0YSgpDQojIHB1bGwgSE1UIGxheWVyIGZyb20gU1FMIHNlcnZlcg0KIyBzZXJ2ZXIgPC0gICBwYXN0ZTAoJ01TU1FMOnNlcnZlcj1iYWx0LWdzbGlzdGVuZXI7JywNCiMgICAgICAgICAgICAgICAgICAgICd1aWQ9ZWdpc19yZWFkZXI7JywNCiMgICAgICAgICAgICAgICAgICAgICdwd2Q9YmFsdGltb3JlMDE7JywNCiMgICAgICAgICAgICAgICAgICAgICdkYXRhYmFzZT1ob3VzaW5nOycsDQojICAgICAgICAgICAgICAgICAgICAndHJ1c3RlZF9jb25uZWN0aW9uPU5vJykNCiMgDQojIGhtdCA8LSByZWFkT0dSKHNlcnZlciwgImhvdXNpbmcuSE1UMjAxNyIpDQojIA0KIyBobXQgPC0gU3BhdGlhbFBvbHlnb25zRGF0YUZyYW1lKGhtdCwgaG10QGRhdGEpDQojIGhtdEBwcm9qNHN0cmluZyA8LSBDUlMoIitpbml0PWVwc2c6MjI0OCIpDQojIGhtdCA8LSBzcFRyYW5zZm9ybShobXQsIENSUygiK2luaXQ9ZXBzZzo0MzI2IikpDQpgYGANCg0KYGBge3J9DQojIG5laWdoYm9yaG9vZCBib3VuZGFyaWVzDQpob29kcy51cmwgPC0gImh0dHBzOi8vZGF0YS5iYWx0aW1vcmVjaXR5Lmdvdi9yZXNvdXJjZS9oM2Z4LTU0cTMuZ2VvanNvbiINCg0KIyBzdXJlbHkgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5LCBhbmQgaSB0cmllZCwgYnV0IGNvdWxkbid0IGdldCBhbnl0aGluZyBlbHNlIHRvIHdvcmsuDQojIGZyb20gZ2VvanNvbiB0byBzZiB0byBzcGF0aWFsIGRmLiBnZW9qc29uX3NwIGRpZG4ndCB3b3JrIGZvciBtZS4NCmhvb2RzIDwtIGdlb2pzb25fc2YoaG9vZHMudXJsKQ0KaG9vZHMgPC0gYXNfU3BhdGlhbChob29kcykNCmhvb2RzIDwtIHNwVHJhbnNmb3JtKGhvb2RzLCBDUlMoIitpbml0PWVwc2c6NDMyNiIpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBIVUQgYXJlYSBtZWRpYW4gaW5jb21lIGZvciBCYWx0aW1vcmUtQ29sdW1iaWEtVG93c29uDQphbWkuMjAxNiA8LSA4NjcwMA0KI2FtaS4yMDE4IDwtIDk0OTAwDQoNCmhtdEBkYXRhIDwtIGhtdEBkYXRhICU+JSBtdXRhdGUoDQogIA0KICAjIGFzc2lnbiBoZWFsdGh5LCBtaWRkbGUsIGFuZCBkaXN0cmVzc2VkIGJhc2VkIG9uIEhNVA0KICBobXQudGllciA9IGNhc2Vfd2hlbigNCiAgICBNVkExN0hyZENkICVpbiUgYygiQSIsICJCIiwgIkMiKSB+ICJoZWFsdGh5IiwNCiAgICBNVkExN0hyZENkICVpbiUgYygiRCIsICJFIiwgIkYiLCAiRyIsICJIIikgfiAibWlkZGxlIiwNCiAgICBNVkExN0hyZENkICVpbiUgYygiSSIsICJKIikgfiAiZGlzdHJlc3NlZCIsDQogICAgVFJVRSB+ICJvdGhlciIpLA0KICANCiAgIyBITVQgYWdhaW4sIGJ1dCB3aXRoIG1pZGRsZSBicm9rZW4gaW4gdHdvDQogIGhtdC50aWVyLjJtaWQgPSBjYXNlX3doZW4oDQogICAgTVZBMTdIcmRDZCAlaW4lIGMoIkEiLCAiQiIsICJDIikgfiAiaGVhbHRoeSIsDQogICAgTVZBMTdIcmRDZCAlaW4lIGMoIkQiLCAiRSIpIH4gInVwcGVyIG1pZGRsZSIsDQogICAgTVZBMTdIcmRDZCAlaW4lIGMoIkYiLCAiRyIsICJIIikgfiAibG93ZXIgbWlkZGxlIiwNCiAgICBNVkExN0hyZENkICVpbiUgYygiSSIsICJKIikgfiAiZGlzdHJlc3NlZCIsDQogICAgVFJVRSB+ICJvdGhlciIpLA0KDQogICMgYXNzaWduIGhlYWx0aHksIG1pZGRsZSwgYW5kIGRpc3RyZXNzZWQgYmFzZWQgb24gYmxvY2sgZ3JvdXAgbWVkaWFuIGluY29tZQ0KICAgIG1lZC5pbmMudGllciA9IA0KICAgIGNhc2Vfd2hlbigNCiAgICAgIChobXQudGllciAhPSAib3RoZXIiKSAmIA0KICAgICAgICAoTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUuMjAxNiA+IDEuMjUgKiBhbWkuMjAxNikgfiAiaGVhbHRoeSIsDQogICAgICAoaG10LnRpZXIgIT0gIm90aGVyIikgJiANCiAgICAgICAgKE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lLjIwMTYgPCAwLjc1ICogYW1pLjIwMTYpIH4gImRpc3RyZXNzZWQiLA0KICAgICAgKGhtdC50aWVyID09ICJvdGhlciIpIH4gTkFfY2hhcmFjdGVyXywNCiAgICAgIFRSVUUgfiAibWlkZGxlIg0KICAgICkNCiAgKQ0KYGBgDQoNCiMgTWlkZGxlIE5laWdoYm9yaG9vZHMgLSBITVQgRGVmaW5pdG9uDQoNClRoaXMgbWFwIHNob3dzIG9ubHkgbWlkZGxlIG5laWdoYm9yaG9vZHMgYmFzZWQgb24gSE1UIChpbmNsdWRlcyBvbmx5IHR5cG9sb2dpZXMgRCB0aHJvdWdoIEgpLiBCbGFjayBib3JkZXJzIGFuZCBsYWJlbHMtb24taG92ZXIgYXJlIGZvciBuZWlnaGJvcmhvb2RzLiBBdCBmaXJzdCBnbGFuY2UsIHRoaXMgcmVtb3ZlcyBuZWlnaGJvcmhvb2RzIHdpdGhpbiB0aGUgIndoaXRlIEwiIGFuZCAiYmxhY2sgYnV0dGVyZmx5IiBuZWlnaGJvcmhvb2RzIG9mIEJhbHRpbW9yZSwgd2l0aCBtb3N0IGV2ZXJ5dGhpbmcgZWxzZSByZW1haW5pbmcuDQoNCmBgYHtyfQ0KbWlkLmhvb2RzLmhtdCA8LSBzdWJzZXQoaG10LCBobXQudGllciA9PSAibWlkZGxlIikNCg0KbGVhZmxldCgpICU+JSANCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBtaWQuaG9vZHMuaG10LCANCiAgICAgICAgICAgICAgY29sb3IgPSBpdGVhbS5jb2xvcnNbMV0sDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsDQogICAgICAgICAgICAgICNmaWxsQ29sb3IgPSB+cGFsKE1WQTE3SHJkQ2QpLA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSBpdGVhbS5jb2xvcnNbMV0sDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjYsDQogICAgICAgICAgICAgICNvcGFjaXR5ID0gMCwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+YXMuY2hhcmFjdGVyKG1pZC5ob29kcy5obXQkTVZBMTdIcmRDZCkNCiAgICAgICAgICAgICAgKSAlPiUNCiAgI2FkZEdlb0pTT04oaG9vZHMsIHdlaWdodCA9IDEsIGNvbG9yID0gImJsYWNrIiwgZmlsbE9wYWNpdHkgPSAwKQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5ob29kcyRsYWJlbCkNCmBgYA0KDQpCcmVha2luZyAibWlkZGxlIiBpbnRvICJsb3dlciBtaWRkbGUiIChGLCBHLCBIKSBhbmQgInVwcGVyIG1pZGRsZSIgKEQsIEUpIGFuZCBpbmNsdWRpbmcgImhlYWx0aHkiIGFuZCAiZGlzdHJlc3NlZDoNCg0KYGBge3J9DQojbWlkLmhvb2RzLmhtdC4ybWlkIDwtIHN1YnNldChobXQsIGhtdC50aWVyLjJtaWQgJWluJSBjKCJsb3dlciBtaWRkbGUiLCAidXBwZXIgbWlkZGxlIikpDQoNCmhtdC4ybWlkLnBhbCA8LSBjb2xvckZhY3RvcigNCiAgZG9tYWluID0gaG10JGhtdC50aWVyLjJtaWQsDQogIHBhbGV0dGUgPSBjKGl0ZWFtLmNvbG9yc1s0XSwNCiAgICAgICAgICAgICAgaXRlYW0uY29sb3JzWzNdLA0KICAgICAgICAgICAgICAiI2Y0ZDU3ZiIsIA0KICAgICAgICAgICAgICBOQSwNCiAgICAgICAgICAgICAgaXRlYW0uY29sb3JzWzFdKQ0KKQ0KDQpsZWFmbGV0KCkgJT4lIA0KICBzZXRWaWV3KGxuZyA9IC03Ni42LCBsYXQgPSAzOS4zLCB6b29tID0gMTEpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRTdGFtZW4uVG9uZXJMaXRlKSAlPiUNCiAgYWRkUG9seWdvbnMoZGF0YSA9IGhtdCwgDQogICAgICAgICAgICAgIGNvbG9yID0gaXRlYW0uY29sb3JzWzFdLA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAxLA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+aG10LjJtaWQucGFsKGhtdC50aWVyLjJtaWQpLA0KICAgICAgICAgICAgICAjZmlsbENvbG9yID0gaXRlYW0uY29sb3JzWzFdLA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC42LA0KICAgICAgICAgICAgICAjb3BhY2l0eSA9IDAsDQogICAgICAgICAgICAgIGxhYmVsID0gfmFzLmNoYXJhY3RlcihobXQkTVZBMTdIcmRDZCkNCiAgICAgICAgICAgICAgKSAlPiUNCiAgI2FkZEdlb0pTT04oaG9vZHMsIHdlaWdodCA9IDEsIGNvbG9yID0gImJsYWNrIiwgZmlsbE9wYWNpdHkgPSAwKQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5ob29kcyRsYWJlbCkNCmBgYA0KDQoNCiMgTWlkZGxlIE5laWdoYm9yaG9vZHMgLSBNZWRpYW4gSW5jb21lIERlZmluaXRpb24NCg0KVGhpcyBtYXAgc2hvd3Mgb25seSBtaWRkbGUgbmVpZ2hib3Job29kcyBiYXNlZCBvbiB0aGUgbWVkaWFuIGluY29tZSBkZWZpbml0aW9uIC0gdGhhdCBpcywgYmxvY2sgZ3JvdXBzIHdoZXJlIHRoZSBob3VzZWhvbGQgbWVkaWFuIGluY29tZSBpcyBiZXR3ZWVuIDc1JSBhbmQgMTI1JSBvZiB0aGUgYXJlYSBtZWRpYW4gaW5jb21lIChbQmFsdGltb3JlLUNvbHVtYmlhLVRvd3NvbiBmb3IgMjAxNl0oaHR0cHM6Ly93d3cuaHVkdXNlci5nb3YvcG9ydGFsL2RhdGFzZXRzL2lsLmh0bWwjMjAxNikpLiBRdWFsaXRhdGl2ZWx5LCB0aGlzIHJlc3VsdHMgaW4gYSBtb3JlIHNwYXJzZSBhbmQgZGlzam9pbnRlZCBkZWZpbml0aW9uIG9mIG1pZGRsZSBuZWlnaGJvcmhvb2RzLiANCg0KYGBge3J9DQptaWQuaG9vZHMubWVkLmluYyA8LSBzdWJzZXQoaG10LCBtZWQuaW5jLnRpZXIgPT0gIm1pZGRsZSIpDQoNCmxlYWZsZXQoKSAlPiUgDQogIHNldFZpZXcobG5nID0gLTc2LjYsIGxhdCA9IDM5LjMsIHpvb20gPSAxMSkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJFN0YW1lbi5Ub25lckxpdGUpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gbWlkLmhvb2RzLm1lZC5pbmMsIA0KICAgICAgICAgICAgICBjb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwNCiAgICAgICAgICAgICAgI2ZpbGxDb2xvciA9IH5wYWwoTVZBMTdIcmRDZCksDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNiwNCiAgICAgICAgICAgICAgI29wYWNpdHkgPSAwLA0KICAgICAgICAgICAgICBsYWJlbCA9IH5hcy5jaGFyYWN0ZXIobWlkLmhvb2RzLm1lZC5pbmMkTVZBMTdIcmRDZCkNCiAgICAgICAgICAgICAgKSAlPiUNCiAgI2FkZEdlb0pTT04oaG9vZHMsIHdlaWdodCA9IDEsIGNvbG9yID0gImJsYWNrIiwgZmlsbE9wYWNpdHkgPSAwKQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5ob29kcyRsYWJlbCkNCmBgYA0KDQojIENvbXBhcmlzb24gb2YgRGVmaW5pdGlvbnMNCg0KVGhlIG1hcCBiZWxvdyBvdmVybGF5cyB0aGUgdHdvIGRlZmluaXRpb25zLg0KDQpgYGB7cn0NCmxlYWZsZXQoKSAlPiUgDQogIHNldFZpZXcobG5nID0gLTc2LjYsIGxhdCA9IDM5LjMsIHpvb20gPSAxMSkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJFN0YW1lbi5Ub25lckxpdGUpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gbWlkLmhvb2RzLm1lZC5pbmMsIA0KICAgICAgICAgICAgICBjb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwNCiAgICAgICAgICAgICAgI2ZpbGxDb2xvciA9IH5wYWwoTVZBMTdIcmRDZCksDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNywNCiAgICAgICAgICAgICAgI29wYWNpdHkgPSAwLA0KICAgICAgICAgICAgICBsYWJlbCA9IH5hcy5jaGFyYWN0ZXIobWlkLmhvb2RzLm1lZC5pbmMkTVZBMTdIcmRDZCkpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gbWlkLmhvb2RzLmhtdCwgDQogICAgICAgICAgICAgIGNvbG9yID0gaXRlYW0uY29sb3JzWzFdLA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAxLA0KICAgICAgICAgICAgICAjZmlsbENvbG9yID0gfnBhbChNVkExN0hyZENkKSwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gaXRlYW0uY29sb3JzWzFdLA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC41LA0KICAgICAgICAgICAgICAjb3BhY2l0eSA9IDAsDQogICAgICAgICAgICAgIGxhYmVsID0gfmFzLmNoYXJhY3RlcihtaWQuaG9vZHMuaG10JE1WQTE3SHJkQ2QpKSAlPiUNCiAgYWRkUG9seWdvbnMoZGF0YSA9IGhvb2RzLCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDAuNSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLCANCiAgICAgICAgICAgICAgbGFiZWwgPSB+aG9vZHMkbGFiZWwpICU+JQ0KICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwNCiAgICAgICAgICAgIGNvbG9ycyA9IGMoaXRlYW0uY29sb3JzWzFdLCBpdGVhbS5jb2xvcnNbM10pLA0KICAgICAgICAgICAgbGFiZWxzID0gYygiSE1UIiwgIk1lZGlhbiBJbmNvbWUiKSkNCmBgYA0KDQpCZWxvdyBpcyBhIHRhYmxlIGNvbXBhcmluZyB0aGUgdHdvIGRlZmluaXRpb25zIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYmxvY2sgZ3JvdXBzIGFuZCBwb3B1bGF0aW9uIGluIGVhY2ggdGllci4gQWJvdXQgNTUlIG9mIEJhbHRpbW9yZSByZXNpZGVudHMgbGl2ZSBpbiBhIG1pZGRsZSBuZWlnaGJvcmhvb2QgYmFzZWQgb24gdGhlIEhNVCBkZWZpbml0aW9uLiBIb3dldmVyLCBvbmx5IGFib3V0IDE0JSBvZiB0aGUgY2l0eSdzIHBvcHVsYXRpb24gbWFrZXMgYmV0d2VlbiA3NSUgYW5kIDEyNSUgb2YgQU1JLiAqKjc1JSBvZiB0aGUgY2l0eSBwb3B1bGF0aW9uIGxpdmVzIGluIGEgYmxvY2sgZ3JvdXAgd2l0aCBtZWRpYW4gaW5jb21lIGJlbG93IDc1JSBvZiBBTUkuKiogKFVzZSB0aGUgcmlnaHQgdHJpYW5nbGUgYXJyb3cgYXQgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHRhYmxlIGhlYWRpbmcgdG8gc2VlIGFkZGl0aW9uYWwgY29sdW1ucy4pDQoNCmBgYHtyfQ0KaG10LnN1bW1hcnkgPC0gaG10QGRhdGEgJT4lIA0KICBncm91cF9ieShobXQudGllcikgJT4lDQogIHN1bW1hcmlzZShuLmJsb2NrLmdyb3Vwcy5obXQgPSBuKCksDQogICAgICAgICAgICBwb3AuaG10ID0gc3VtKFBvcHVsYXRpb24uMjAxNikpICU+JQ0KICBtdXRhdGUocGN0LmJsb2NrLmdyb3Vwcy5obXQgPSBwZXJjZW50KG4uYmxvY2suZ3JvdXBzLmhtdCAvIHN1bShuLmJsb2NrLmdyb3Vwcy5obXQpKSwNCiAgICAgICAgIHBjdC5wb3AuaG10ID0gcGVyY2VudChwb3AuaG10IC8gc3VtKHBvcC5obXQpKSkNCg0KbWVkLmluYy5zdW1tbWFyeSA8LSBobXRAZGF0YSAlPiUgDQogIGdyb3VwX2J5KG1lZC5pbmMudGllcikgJT4lDQogIHN1bW1hcmlzZShuLmJsb2NrLmdyb3Vwcy5tZWQuaW5jID0gbigpLA0KICAgICAgICAgICAgcG9wLm1lZC5pbmMgPSBzdW0oUG9wdWxhdGlvbi4yMDE2KSkgJT4lDQogIG11dGF0ZShwY3QuYmxvY2suZ3JvdXBzLm1lZC5pbmMgPSBwZXJjZW50KG4uYmxvY2suZ3JvdXBzLm1lZC5pbmMgLyBzdW0obi5ibG9jay5ncm91cHMubWVkLmluYykpLA0KICAgICAgICAgcGN0LnBvcC5tZWQuaW5jID0gcGVyY2VudChwb3AubWVkLmluYyAvIHN1bShwb3AubWVkLmluYykpKQ0KDQpsZWZ0X2pvaW4oaG10LnN1bW1hcnksIG1lZC5pbmMuc3VtbW1hcnksIGJ5ID0gYygiaG10LnRpZXIiID0gIm1lZC5pbmMudGllciIpKSAlPiUNCiAgcmVuYW1lKHRpZXIgPSAiaG10LnRpZXIiKSAlPiUNCiAgZmlsdGVyKHRpZXIgIT0gIm90aGVyIikNCmBgYA0KDQoNCiMgSW5jb21lcyBpbiBITVQgTWlkZGxlIE5laWdoYm9yaG9vZHMNCg0KVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBjb21iaW5hdGlvbiBvZiBuZWlnaGJvcmhvb2QgaG91c2luZyBtYXJrZXQgdGllciAoYmFzZWQgb24gSE1UKSBhbmQgbWVkaWFuIGluY29tZSBsZXZlbHMgaW4gZWFjaCBtYXJrZXQgdGllciAoYmVsb3cgNzUlIEFNSSwgYmV0d2VlbiA3NSUgYW5kIDEyNSUgQU1JLCBtb3JlIHRoYW4gMTI1JSBBTUkpLg0KDQpBTUkgdXNlZCBpcyBcJDg2LDcwMCBiYXNlZCBvbiBIVUQncyBGWTE2IGZpZ3VyZSBmb3IgQmFsdGltb3JlLUNvbHVtYmlhLVRvd3Nvbi4gRm9yIEZZMTgsIHRoZSBudW1iZXIgaXMgXCQ5NCw0MDAsIGhvd2V2ZXIgdGhlIG1lZGlhbiBpbmNvbWUgZGF0YSBiZWluZyB1c2VkIGluIHRoaXMgYW5hbHlzaXMgaXMgdGhlIDUteWVhciBBQ1MgZXN0aW1hdGVzIGVuZGluZyBpbiAyMDE2Lg0KDQoNCg0KYGBge3J9DQpobXRAZGF0YSA8LSBobXRAZGF0YSAlPiUgbXV0YXRlKA0KICANCiAgaW5jLmJyYWNrZXQgPSBjYXNlX3doZW4oDQogICAgTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUuMjAxNiA+IDEuMjUgKiBhbWkuMjAxNiB+ICJhYm92ZSAxMjUlIEFNSSIsDQogICAgTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUuMjAxNiA8IDAuNzUgKiBhbWkuMjAxNiB+ICJiZWxvdyA3NSUgQU1JIiwNCiAgICBUUlVFIH4gImJldHdlZW4gNzUlIGFuZCAxMjUlIEFNSSIpLA0KICANCiAgdGllci5pbmMuYnJhY2tldCA9IGFzLmNoYXJhY3RlcihwYXN0ZTAoaG10LnRpZXIuMm1pZCwgIiB8ICIsIGluYy5icmFja2V0KSkNCiAgDQopDQoNCmhtdEBkYXRhICU+JQ0KICBncm91cF9ieSh0aWVyLmluYy5icmFja2V0KSAlPiUNCiAgc3VtbWFyaXNlKG4uYmxvY2suZ3JvdXBzID0gbigpLA0KICAgICAgICAgICAgcG9wID0gc3VtKFBvcHVsYXRpb24uMjAxNikpICU+JQ0KICBtdXRhdGUocGN0LmNpdHkucG9wID0gcGVyY2VudChwb3AgLyBzdW0ocG9wKSkpDQpgYGANCg0KSW50ZXJlc3RpbmcgdG8gbm90ZSB0aGF0IGFsbCBob3VzaW5nIG1hcmtldCB0aWVycyBpbmNsdWRlIHRoZSBsb3cgYW5kIG1pZGRsZSBtZWRpYW4gaW5jb21lIHJhbmdlcywgYnV0IG9ubHkgdGhlIGhlYWx0aHkgSE1UIHRpZXIgaW5jbHVkZXMgYmxvY2sgZ3JvdXBzIHdpdGggbWVkaWFuIGluY29tZXMgb3ZlciAxMjUlIG9mIEFNSS4NCg0KSGVyZSdzIGFuIGFsYXJtaW5nIG51Z2dldDogNTUlIG9mIHRoZSBjaXR5IHBvcHVsYXRpb24gaXMgaW4gYSBtaWRkbGUgbmVpZ2hib3Job29kICwgYW5kICoqOTAlIG9mIHRoZSBtaWRkbGUgbmVpZ2hib3Job29kIHBvcHVsYXRpb24qKiBsaXZlcyBpbiBhIGJsb2NrIGdyb3VwIHdpdGggYSBtZWRpYW4gaW5jb21lIGxlc3MgdGhhbiA3NSUgQU1JOg0KDQpgYGB7cn0NCmhtdEBkYXRhICU+JQ0KICBmaWx0ZXIoaG10LnRpZXIgPT0gIm1pZGRsZSIpICU+JQ0KICBncm91cF9ieSh0aWVyLmluYy5icmFja2V0KSAlPiUNCiAgc3VtbWFyaXNlKG4uYmxvY2suZ3JvdXBzID0gbigpLA0KICAgICAgICAgICAgcG9wID0gc3VtKFBvcHVsYXRpb24uMjAxNikpICU+JQ0KICBtdXRhdGUocGN0ID0gcGVyY2VudChwb3AgLyBzdW0ocG9wKSkpDQpgYGANCg0KIyMjIE1pZGRsZSBOZWlnaGJvcmhvb2RzIHdpdGggTG93IG9yIEhpZ2ggSW5jb21lcw0KDQooTm8gbWlkZGxlIG5laWdoYm9yaG9vZCBibG9jayBncm91cHMgd2l0aCA+MTI1JSBBTUkuKQ0KDQpgYGB7cn0NCnRpZXIuaW5jb21lLnN1YnNldCA8LSBzdWJzZXQoaG10LCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhtdC50aWVyLjJtaWQgJWluJSBjKCJsb3dlciBtaWRkbGUiLCAidXBwZXIgbWlkZGxlIikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmMuYnJhY2tldCAlaW4lIGMoImFib3ZlIDEyNSUgQU1JIiwgImJlbG93IDc1JSBBTUkiKSAmKQ0KDQp0aWVyLmluYy5wYWwgPC0gY29sb3JGYWN0b3IoDQogIGRvbWFpbiA9IHRpZXIuaW5jb21lLnN1YnNldCR0aWVyLmluYy5icmFja2V0LA0KICBwYWxldHRlID0gYyhpdGVhbS5jb2xvcnNbMV0sDQogICAgICAgICAgICAgIGl0ZWFtLmNvbG9yc1szXSkNCikNCg0KbGVhZmxldCgpICU+JSANCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSB0aWVyLmluY29tZS5zdWJzZXQsIA0KICAgICAgICAgICAgICBjb2xvciA9IGl0ZWFtLmNvbG9yc1syXSwNCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnRpZXIuaW5jLnBhbCh0aWVyLmluYy5icmFja2V0KSwNCiAgICAgICAgICAgICAgI2ZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1sxXSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjcsDQogICAgICAgICAgICAgICNvcGFjaXR5ID0gMCwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+YXMuY2hhcmFjdGVyKHBhc3RlMCh0aWVyLmluY29tZS5zdWJzZXQkdGllci5pbmMuYnJhY2tldCkpDQogICAgICAgICAgICAgICkgJT4lDQogICNhZGRHZW9KU09OKGhvb2RzLCB3ZWlnaHQgPSAxLCBjb2xvciA9ICJibGFjayIsIGZpbGxPcGFjaXR5ID0gMCkNCiAgYWRkUG9seWdvbnMoZGF0YSA9IGhvb2RzLA0KICAgICAgICAgICAgIHdlaWdodCA9IDIsDQogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUsDQogICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLA0KICAgICAgICAgICAgIGxhYmVsID0gfmhvb2RzJGxhYmVsKSAlPiUNCiAgYWRkTGVnZW5kKCJib3R0b21yaWdodCIsDQogICAgICAgICAgICBjb2xvcnMgPSBjKGl0ZWFtLmNvbG9yc1sxXSwgaXRlYW0uY29sb3JzWzNdKSwNCiAgICAgICAgICAgIGxhYmVscyA9IGMoImxvd2VyIG1pZGRsZSB8IGJlbG93IDc1JSBBTUkiLCAidXBwZXIgbWlkZGxlIHwgYmVsb3cgNzUlIEFNSSIpKQ0KYGBgDQoNCiMjIyBIZWFsdGh5IGFuZCBEaXN0cmVzc2VkIE5laWdoYm9yaG9vZHMgd2l0aCBNb2RlcmF0ZSBJbmNvbWUNCg0KYGBge3J9DQp0aWVyLmluY29tZS5zdWJzZXQgPC0gc3Vic2V0KA0KICBobXQsICANCiAgdGllci5pbmMuYnJhY2tldCAlaW4lIGMoImRpc3RyZXNzZWQgfCBiZXR3ZWVuIDc1JSBhbmQgMTI1JSBBTUkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhbHRoeSB8IGJldHdlZW4gNzUlIGFuZCAxMjUlIEFNSSIpDQopDQoNCnRpZXIuaW5jLnBhbCA8LSBjb2xvckZhY3RvcigNCiAgZG9tYWluID0gdGllci5pbmNvbWUuc3Vic2V0JHRpZXIuaW5jLmJyYWNrZXQsDQogIHBhbGV0dGUgPSBjKGl0ZWFtLmNvbG9yc1s0XSwNCiAgICAgICAgICAgICAgaXRlYW0uY29sb3JzWzVdKQ0KKQ0KDQpsZWFmbGV0KCkgJT4lIA0KICBzZXRWaWV3KGxuZyA9IC03Ni42LCBsYXQgPSAzOS4zLCB6b29tID0gMTEpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRTdGFtZW4uVG9uZXJMaXRlKSAlPiUNCiAgYWRkUG9seWdvbnMoZGF0YSA9IHRpZXIuaW5jb21lLnN1YnNldCwgDQogICAgICAgICAgICAgIGNvbG9yID0gaXRlYW0uY29sb3JzWzJdLA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAxLA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+dGllci5pbmMucGFsKHRpZXIuaW5jLmJyYWNrZXQpLA0KICAgICAgICAgICAgICAjZmlsbENvbG9yID0gaXRlYW0uY29sb3JzWzFdLA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNywNCiAgICAgICAgICAgICAgI29wYWNpdHkgPSAwLA0KICAgICAgICAgICAgICBsYWJlbCA9IH5hcy5jaGFyYWN0ZXIocGFzdGUwKHRpZXIuaW5jb21lLnN1YnNldCR0aWVyLmluYy5icmFja2V0KSkNCiAgICAgICAgICAgICAgKSAlPiUNCiAgI2FkZEdlb0pTT04oaG9vZHMsIHdlaWdodCA9IDEsIGNvbG9yID0gImJsYWNrIiwgZmlsbE9wYWNpdHkgPSAwKQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsDQogICAgICAgICAgICAgd2VpZ2h0ID0gMiwNCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgb3BhY2l0eSA9IDAuNSwNCiAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsDQogICAgICAgICAgICAgbGFiZWwgPSB+aG9vZHMkbGFiZWwpICU+JQ0KICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwNCiAgICAgICAgICAgIGNvbG9ycyA9IGMoaXRlYW0uY29sb3JzWzRdLCBpdGVhbS5jb2xvcnNbNV0pLA0KICAgICAgICAgICAgbGFiZWxzID0gYygiZGlzdHJlc3NlZCB8IGJldHdlZW4gNzUlIGFuZCAxMjUlIEFNSSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiaGVhbHRoeSB8IGJldHdlZW4gNzUlIGFuZCAxMjUlIEFNSSIpKQ0KYGBgDQoNCg0KIyMjIEhlYWx0aHkgTmVpZ2hib3Job29kcyB3aXRoIExvdyBNZWRpYW4gSW5jb21lDQoNCmBgYHtyfQ0KdGllci5pbmNvbWUuc3Vic2V0IDwtIHN1YnNldCgNCiAgaG10LCAgDQogIHRpZXIuaW5jLmJyYWNrZXQgJWluJSBjKCJoZWFsdGh5IHwgYmVsb3cgNzUlIEFNSSIpDQopDQoNCnRpZXIuaW5jLnBhbCA8LSBjb2xvckZhY3RvcigNCiAgZG9tYWluID0gdGllci5pbmNvbWUuc3Vic2V0JHRpZXIuaW5jLmJyYWNrZXQsDQogIHBhbGV0dGUgPSBjKGl0ZWFtLmNvbG9yc1s1XSkNCikNCg0KbGVhZmxldCgpICU+JSANCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSB0aWVyLmluY29tZS5zdWJzZXQsIA0KICAgICAgICAgICAgICBjb2xvciA9IGl0ZWFtLmNvbG9yc1syXSwNCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnRpZXIuaW5jLnBhbCh0aWVyLmluYy5icmFja2V0KSwNCiAgICAgICAgICAgICAgI2ZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1sxXSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjcsDQogICAgICAgICAgICAgICNvcGFjaXR5ID0gMCwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+YXMuY2hhcmFjdGVyKHBhc3RlMCh0aWVyLmluY29tZS5zdWJzZXQkdGllci5pbmMuYnJhY2tldCkpDQogICAgICAgICAgICAgICkgJT4lDQogICNhZGRHZW9KU09OKGhvb2RzLCB3ZWlnaHQgPSAxLCBjb2xvciA9ICJibGFjayIsIGZpbGxPcGFjaXR5ID0gMCkNCiAgYWRkUG9seWdvbnMoZGF0YSA9IGhvb2RzLA0KICAgICAgICAgICAgIHdlaWdodCA9IDIsDQogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUsDQogICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLA0KICAgICAgICAgICAgIGxhYmVsID0gfmhvb2RzJGxhYmVsKSAlPiUNCiAgYWRkTGVnZW5kKCJib3R0b21yaWdodCIsDQogICAgICAgICAgICBjb2xvcnMgPSBjKGl0ZWFtLmNvbG9yc1s1XSksDQogICAgICAgICAgICBsYWJlbHMgPSBjKCJoZWFsdGh5IHwgYmVsb3cgNzUlIEFNSSIpKQ0KDQpgYGANCg0KDQojIENoYXJhY3RlcmlzdGljcyBvZiBNaWRkbGUgTmVpZ2hib3Job29kcw0KDQpVc2luZyB0aGUgSE1UIGRlZmluaXRpb24gZm9yIG1pZGRsZSBuZWlnaGJvcmhvb2RzLCB0aGUgZm9sbG93aW5nIGFyZSBsb29rcyBhdCBibG9jayBncm91cCBjaGFyYWN0ZXJpc3RpY3MgZ3JvdXBlZCBieSB0aWVyLg0KDQpCZWNhdXNlIHRoZSBITVQgdXNlcyBhIGNsdXN0ZXIgYW5hbHlzaXMgdGhhdCBpbmNsdWRlcyBzZXZlcmFsIGhvdXNpbmcgdmFyaWFibGVzLCB3ZSdkIGV4cGVjdCB0aGVyZSB0byBiZSBhbiBvdmVybGFwIGluIHRoZSBtZWRpYW4gaW5jb21lIGRpc3RyaWJ1dGlvbnMgYmVjYXVzZSB0aGUgdGllcnMgd2VyZSBub3QgZGVmaW5lZCBieSBtZWRpYW4gaW5jb21lLg0KDQpgYGB7cn0NCmhtdEBkYXRhICU+JSANCiAgZmlsdGVyKGhtdC50aWVyICE9ICJvdGhlciIsDQogICAgICAgICAhaXMubmEoTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUuMjAxNikpICU+JSANCiAgZ2dwbG90KGFlcyhNZWRpYW5fSG91c2Vob2xkX0luY29tZS4yMDE2KSkgKw0KICBnZW9tX2ZyZXFwb2x5KGFlcyhjb2xvciA9IGhtdC50aWVyKSwgYmlucyA9IDUwKSArDQogIHRoZW1lX2l0ZWFtX3ByZXNlbnRhdGlvbnMoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSBwYXN0ZTAoIkJsb2NrIEdyb3VwIE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lXG4iLA0KICAgICAgICAgICAgICAgICAgICJEaXN0cmlidXRpb24gYnkgSE1UIE1hcmtldCB0aWVyIiksDQogICAgc3VidGl0bGUgPSAiIiwNCiAgICB4ID0gIk1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIiwNCiAgICB5ID0gIkNvdW50IiwNCiAgICBjYXB0aW9uID0gcGFzdGUwKCJ0aWVyIGJhc2VkIG9uIDIwMTcgSE1UIGFuYWx5c2lzOyAiLA0KICAgICAgICAgICAgICAgICAgICAgIm1lZGlhbiBob3VzZWhvbGQgaW5jb21lcyBmcm9tIDIwMTItMjAxNiBBQ1MgZGF0YS4iKQ0KICApICsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IGFtaS4yMDE2KSwgY29sb3IgPSBpdGVhbS5jb2xvcnNbMl0pICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYW1pLjIwMTYgKyAyNTAwLCB5ID0gMjUsIA0KICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiQmFsdGltb3JlLUNvbHVtYmlhLVRvd3NvbiAyMDE2IEFNSTpcbiIsIGRvbGxhcihhbWkuMjAxNikpLA0KICAgICAgICAgICBoanVzdCA9IDApICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMSwgZmFjZSA9ICJwbGFpbiIpKQ0KYGBgDQoNCkRpZmZlcmVuY2UgaW4gbWVkaWFuIGluY29tZXMgYmV0d2VlbiB1cHBlciBhbmQgbG93ZXIgbWlkZGxlIG5laWdoYm9yaG9vZHMuDQoNCmBgYHtyfQ0KaG10QGRhdGEgJT4lIA0KICBmaWx0ZXIoaG10LnRpZXIgIT0gIm90aGVyIiwNCiAgICAgICAgICFpcy5uYShNZWRpYW5fSG91c2Vob2xkX0luY29tZS4yMDE2KSwNCiAgICAgICAgIGhtdC50aWVyID09ICJtaWRkbGUiKSAlPiUgDQogIGdncGxvdChhZXMoTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUuMjAxNikpICsNCiAgZ2VvbV9mcmVxcG9seShhZXMoY29sb3IgPSBobXQudGllci4ybWlkKSwgYmlucyA9IDUwKSArDQogIHRoZW1lX2l0ZWFtX3ByZXNlbnRhdGlvbnMoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSBwYXN0ZTAoIk1pZGRsZSBOZWlnaGJvcmhvb2RcbkJsb2NrIEdyb3VwIE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lXG4iLA0KICAgICAgICAgICAgICAgICAgICJEaXN0cmlidXRpb24gYnkgSE1UIE1hcmtldCB0aWVyIiksDQogICAgc3VidGl0bGUgPSAiIiwNCiAgICB4ID0gIk1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIiwNCiAgICB5ID0gIkNvdW50IiwNCiAgICBjYXB0aW9uID0gcGFzdGUwKCJ0aWVyIGJhc2VkIG9uIDIwMTcgSE1UIGFuYWx5c2lzOyAiLA0KICAgICAgICAgICAgICAgICAgICAgIm1lZGlhbiBob3VzZWhvbGQgaW5jb21lcyBmcm9tIDIwMTItMjAxNiBBQ1MgZGF0YS4iKQ0KICApICsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IGFtaS4yMDE2KSwgY29sb3IgPSBpdGVhbS5jb2xvcnNbMl0pICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYW1pLjIwMTYgLSAyNTAwLCB5ID0gMTYsIA0KICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiQmFsdGltb3JlLUNvbHVtYmlhLVRvd3NvbiAyMDE2IEFNSTpcbiIsIGRvbGxhcihhbWkuMjAxNikpLA0KICAgICAgICAgICBoanVzdCA9IDEpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMSwgZmFjZSA9ICJwbGFpbiIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KTWlkZGxlIG5laWdoYm9yaG9vZHMgZG8gc2VlbSB0byBza2V3IHRvd2FyZHMgb2xkZXIgaG9tZW93bmVyc2hpcC4NCg0KYGBge3J9DQpobXRAZGF0YSAlPiUgDQogIGZpbHRlcihobXQudGllciAhPSAib3RoZXIiKSAlPiUgDQogIGdncGxvdChhZXMoUGVyY2VudF9Ib21lb3duZXJfT3Zlcl82NS4yMDE2KSkgKw0KICBnZW9tX2ZyZXFwb2x5KGFlcyhjb2xvciA9IGhtdC50aWVyKSwgc3RhdCA9ICJkZW5zaXR5IikgKw0KICB0aGVtZV9pdGVhbV9wcmVzZW50YXRpb25zKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIiUgSG9tZW93bmVycyA2NSsgYnkgSE1UIE1hcmtldCB0aWVyIiwNCiAgICBzdWJ0aXRsZSA9ICIiLA0KICAgIHggPSAiJSBIb21lb3duZXJzIDY1KyB5Lm8uIiwNCiAgICB5ID0gIkRlbnNpdHkiLA0KICAgIGNhcHRpb24gPSBwYXN0ZTAoInRpZXIgYmFzZWQgb24gMjAxNyBITVQgYW5hbHlzaXM7ICIsDQogICAgICAgICAgICAgICAgICAgICAiJSBob21lb3duZXJzIDY1IGFuZCBvdmVyIGZyb20gMjAxMi0yMDE2IEFDUyBkYXRhLiIpDQogICkgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAxLCBmYWNlID0gInBsYWluIikpDQpgYGANCg0KQmVsb3cgaXMgdGhlIGF2ZXJhZ2UgYmxvY2sgZ3JvdXAgcGVyY2VudGFnZSBvZiBob21lb3duZXJzIHRoYXQgYXJlIG92ZXIgdGhlIGFnZSBvZiA2NS4NCg0KYGBge3J9DQpobXRAZGF0YSAlPiUNCiAgZmlsdGVyKGhtdC50aWVyICE9ICJvdGhlciIpICU+JQ0KICBncm91cF9ieShobXQudGllcikgJT4lDQogIHN1bW1hcmlzZShtZWFuLnBjdC5oby5vdmVyNjUgPSBtZWFuKFBlcmNlbnRfSG9tZW93bmVyX092ZXJfNjUuMjAxNikpDQpgYGANCg0KV2hpbGUgYWJvdXQgNTQlIG9mIHRoZSBjaXR5IHBvcHVsYXRpb24gbGl2ZXMgaW4gbWlkZGxlIG5laWdoYm9yaG9vZHMsIDY1JSBvZiB0aGUgaG91c2Vob2xkcyB3aXRoIGEgaG9tZW93bmVyIDY1IHllYXJzIG9mIGFnZSBvciBvbGRlciBsaXZlIGluIGEgbWlkZGxlIG5laWdoYm9yaG9vZC4NCg0KYGBge3J9DQpobXRAZGF0YSAlPiUNCiAgZmlsdGVyKGhtdC50aWVyICE9ICJvdGhlciIpICU+JQ0KICBtdXRhdGUoaGggPSBQb3B1bGF0aW9uLjIwMTYgLyBIb3VzZWhvbGRfU2l6ZS4yMDE2LA0KICAgICAgICAgaGgub3duID0gaGggKiBQZXJjZW50X093bmVyLjIwMTYsDQogICAgICAgICBoaC5vd25lci5vdmVyNjUgPSBoaC5vd24gKiBQZXJjZW50X0hvbWVvd25lcl9PdmVyXzY1LjIwMTYpICU+JQ0KICBncm91cF9ieShobXQudGllcikgJT4lDQogIHN1bW1hcmlzZShoaC5vd25lci5vdmVyNjUgPSBzdW0oaGgub3duZXIub3ZlcjY1KSkgJT4lDQogIG11dGF0ZShwY3QuY2l0eS5vd25lci5vdmVyNjUgPSBwZXJjZW50KGhoLm93bmVyLm92ZXI2NSAvIHN1bShoaC5vd25lci5vdmVyNjUpKSkNCmBgYA0KDQo=